package abstractClass;

import java.io.File;
import java.util.List;

/**
 * 报告生成器模板 - 抽象类
 */
public abstract class ReportGenerator {
    
    /**
     * 生成报告模板方法
     */
    public final File generateReport(String title, List<Object> data) {
        // 1. 准备数据
        List<Object> processedData = prepareData(data);
        
        // 2. 生成报告头
        String header = generateHeader(title);
        
        // 3. 生成报告内容
        String content = generateContent(processedData);
        
        // 4. 生成报告尾
        String footer = generateFooter();
        
        // 5. 组合报告
        String report = combineReport(header, content, footer);
        
        // 6. 格式化报告
        String formattedReport = formatReport(report);
        
        // 7. 保存报告
        File reportFile = saveReport(formattedReport);
        
        return reportFile;
    }
    
    // 抽象方法 - 必须由子类实现
    
    /**
     * 生成报告内容
     */
    protected abstract String generateContent(List<Object> data);
    
    /**
     * 格式化报告
     */
    protected abstract String formatReport(String report);
    
    /**
     * 保存报告
     */
    protected abstract File saveReport(String report);
    
    // 具体方法 - 提供默认实现
    
    protected List<Object> prepareData(List<Object> data) {
        System.out.println("准备数据...");
        // 数据清洗、转换等预处理
        return data;
    }
    
    protected String generateHeader(String title) {
        return "报告标题: " + title + "\n生成时间: " + new java.util.Date() + "\n";
    }
    
    protected String generateFooter() {
        return "\n--- 报告结束 ---";
    }
    
    protected String combineReport(String header, String content, String footer) {
        return header + content + footer;
    }
    
    // 钩子方法 - 子类可以选择性重写
    
    protected boolean needCompression() {
        return false;
    }
}